﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace PDI
{
    public static class Mascaras
    {
        private static Processador processador;

        public static Imagem MascaraDeSobel(Imagem imgOriginal)
        {
            processador = new Processador();
            Imagem imgRetorno = new Imagem(new Bitmap(imgOriginal.getBitmap().Width, imgOriginal.getBitmap().Height));


            Bitmap b = processador.converterGrayScaleBT709(imgOriginal).getBitmap();

            //Bitmap bmpRetorno = new Bitmap(imgOriginal.getBitmap().Width, imgOriginal.getBitmap().Height);

            int largura = b.Width;
            int altura = b.Height;

            int[,] eixoX = new int[,] { { -1, 0, 1 }, { -2, 0, 2 }, { -1, 0, 1 } };
            int[,] eixoY = new int[,] { { 1, 2, 1 }, { 0, 0, 0 }, { -1, -2, -1 } };

            int[,] mImagemR = new int[largura, altura];
            int[,] mImagemG = new int[largura, altura];
            int[,] mImagemB = new int[largura, altura];

            int valorR = 0;
            int valorG = 0;
            int valorB = 0;

            for (int i = 0; i < largura; i++)
            {
                for (int j = 0; j < altura; j++)
                {
                    mImagemR[i, j] = b.GetPixel(i, j).R;
                    mImagemG[i, j] = b.GetPixel(i, j).G;
                    mImagemB[i, j] = b.GetPixel(i, j).B;
                }
            }

            int new_rx = 0, new_ry = 0;
            int new_gx = 0, new_gy = 0;
            int new_bx = 0, new_by = 0;
            int rc, gc, bc;
            for (int i = 1; i < b.Width - 1; i++)
            {
                for (int j = 1; j < b.Height - 1; j++)
                {

                    new_rx = 0;
                    new_ry = 0;
                    new_gx = 0;
                    new_gy = 0;
                    new_bx = 0;
                    new_by = 0;
                    rc = 0;
                    gc = 0;
                    bc = 0;

                    for (int lg = -1; lg < 2; lg++)
                    {
                        for (int alt = -1; alt < 2; alt++)
                        {
                            rc = mImagemR[i + alt, j + lg];
                            new_rx += eixoX[lg + 1, alt + 1] * rc;
                            new_ry += eixoY[lg + 1, alt + 1] * rc;

                            gc = mImagemG[i + alt, j + lg];
                            new_gx += eixoX[lg + 1, alt + 1] * gc;
                            new_gy += eixoY[lg + 1, alt + 1] * gc;

                            bc = mImagemB[i + alt, j + lg];
                            new_bx += eixoX[lg + 1, alt + 1] * bc;
                            new_by += eixoY[lg + 1, alt + 1] * bc;


                        }
                    }

                    valorR = Convert.ToInt32(Math.Sqrt(Math.Pow(new_rx, 2) + Math.Pow(new_ry, 2)));
                    valorG = Convert.ToInt32(Math.Sqrt(Math.Pow(new_gx, 2) + Math.Pow(new_gy, 2)));
                    valorB = Convert.ToInt32(Math.Sqrt(Math.Pow(new_bx, 2) + Math.Pow(new_by, 2)));

                    if(valorR > 255)
                        valorR = 255;
                    if (valorR < 0)
                        valorR = 0;

                    if (valorG > 255)
                        valorG = 255;
                    if (valorG < 0)
                        valorG = 0;

                    if (valorB > 255)
                        valorB = 255;
                    if (valorB < 0)
                        valorB = 0;

                    imgRetorno.setRGB(i, j, valorR, valorG, valorB);
                }
            }
            

            return imgRetorno;

        }


        public static Imagem MascaraDeSobelHorizontal(Imagem imgOriginal)
        {
            processador = new Processador();
            Imagem imgRetorno = new Imagem(new Bitmap(imgOriginal.getBitmap().Width, imgOriginal.getBitmap().Height));


            Bitmap b = processador.converterGrayScaleBT709(imgOriginal).getBitmap();

            //Bitmap bmpRetorno = new Bitmap(imgOriginal.getBitmap().Width, imgOriginal.getBitmap().Height);

            int largura = b.Width;
            int altura = b.Height;

            int[,] eixoY = new int[,] { { 1, 2, 1 }, { 0, 0, 0 }, { -1, -2, -1 } };

            int[,] mImagemR = new int[largura, altura];
            int[,] mImagemG = new int[largura, altura];
            int[,] mImagemB = new int[largura, altura];

            int valorR = 0;
            int valorG = 0;
            int valorB = 0;

            for (int i = 0; i < largura; i++)
            {
                for (int j = 0; j < altura; j++)
                {
                    mImagemR[i, j] = b.GetPixel(i, j).R;
                    mImagemG[i, j] = b.GetPixel(i, j).G;
                    mImagemB[i, j] = b.GetPixel(i, j).B;
                }
            }

            int  new_ry = 0;
            int  new_gy = 0;
            int  new_by = 0;
            int rc, gc, bc;
            for (int i = 1; i < b.Width - 1; i++)
            {
                for (int j = 1; j < b.Height - 1; j++)
                {

                    
                    new_ry = 0;
                    
                    new_gy = 0;
                    
                    new_by = 0;
                    rc = 0;
                    gc = 0;
                    bc = 0;

                    for (int lg = -1; lg < 2; lg++)
                    {
                        for (int alt = -1; alt < 2; alt++)
                        {
                            rc = mImagemR[i + alt, j + lg];
                            new_ry += eixoY[lg + 1, alt + 1] * rc;

                            gc = mImagemG[i + alt, j + lg];
                            
                            new_gy += eixoY[lg + 1, alt + 1] * gc;

                            bc = mImagemB[i + alt, j + lg];
                            new_by += eixoY[lg + 1, alt + 1] * bc;


                        }
                    }

                    valorR = new_ry;
                    valorG = new_gy;
                    valorB = new_by;

                    if (valorR > 255)
                        valorR = 255;
                    if (valorR < 0)
                        valorR = 0;

                    if (valorG > 255)
                        valorG = 255;
                    if (valorG < 0)
                        valorG = 0;

                    if (valorB > 255)
                        valorB = 255;
                    if (valorB < 0)
                        valorB = 0;

                    imgRetorno.setRGB(i, j, valorR, valorG, valorB);
                }
            }


            return imgRetorno;

        }

        public static Imagem MascaraDeSobelVertical(Imagem imgOriginal)
        {
            processador = new Processador();
            Imagem imgRetorno = new Imagem(new Bitmap(imgOriginal.getBitmap().Width, imgOriginal.getBitmap().Height));


            Bitmap b = processador.converterGrayScaleBT709(imgOriginal).getBitmap();

            //Bitmap bmpRetorno = new Bitmap(imgOriginal.getBitmap().Width, imgOriginal.getBitmap().Height);

            int largura = b.Width;
            int altura = b.Height;

            int[,] eixoX = new int[,] { { -1, 0, 1 }, { -2, 0, 2 }, { -1, 0, 1 } };

            int[,] mImagemR = new int[largura, altura];
            int[,] mImagemG = new int[largura, altura];
            int[,] mImagemB = new int[largura, altura];

            int valorR = 0;
            int valorG = 0;
            int valorB = 0;

            for (int i = 0; i < largura; i++)
            {
                for (int j = 0; j < altura; j++)
                {
                    mImagemR[i, j] = b.GetPixel(i, j).R;
                    mImagemG[i, j] = b.GetPixel(i, j).G;
                    mImagemB[i, j] = b.GetPixel(i, j).B;
                }
            }

            int new_rx = 0;
            int new_gx = 0;
            int new_bx = 0;
            int rc, gc, bc;
            for (int i = 1; i < b.Width - 1; i++)
            {
                for (int j = 1; j < b.Height - 1; j++)
                {
                    new_rx = 0;
                    new_gx = 0;
                    new_bx = 0;
                    rc = 0;
                    gc = 0;
                    bc = 0;

                    for (int lg = -1; lg < 2; lg++)
                    {
                        for (int alt = -1; alt < 2; alt++)
                        {
                            rc = mImagemR[i + alt, j + lg];
                            new_rx += eixoX[lg + 1, alt + 1] * rc;

                            gc = mImagemG[i + alt, j + lg];
                            new_gx += eixoX[lg + 1, alt + 1] * gc;

                            bc = mImagemB[i + alt, j + lg];
                            new_bx += eixoX[lg + 1, alt + 1] * bc;


                        }
                    }

                    valorR = new_rx;
                    valorG = new_gx;
                    valorB = new_bx;

                    if (valorR > 255)
                        valorR = 255;
                    if (valorR < 0)
                        valorR = 0;

                    if (valorG > 255)
                        valorG = 255;
                    if (valorG < 0)
                        valorG = 0;

                    if (valorB > 255)
                        valorB = 255;
                    if (valorB < 0)
                        valorB = 0;

                    imgRetorno.setRGB(i, j, valorR, valorG, valorB);
                }
            }


            return imgRetorno;

        }
    }
}
